import { injectable } from 'inversify';
import { Strategy, ExtractJwt } from 'passport-jwt'; // passport的一个插件,基于 JSON Web Token（JWT）进行身份验证和授权
import passport from 'passport';
import jsonwebtoken from 'jsonwebtoken';
@injectable()
export class JWT {
	private secret = 'your_secret_key';
	private jwtOptions = {
		jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
		secretOrKey: this.secret
	};
	constructor() {
    // 执行策略,将插件注册到passport
		this.strategy();
	}

	/**
	 * 创建Token
	 */
	public createToken(data: object) {
		return jsonwebtoken.sign(data, this.secret, { expiresIn: '7d' });
	}

	/**
	 * 配置：配置 Passport 使用 passport-jwt 策略进行 JWT 身份验证。
	 */
	public strategy() {
		const strategy = new Strategy(this.jwtOptions, (payload, done) => {
			// 验证 payload 中的数据，如果验证通过，则将用户信息传递给 done 函数，否则调用 done 函数并传递错误信息
			done(null, payload);
		});
		passport.use(strategy);
	}

	/**
	 * 创建校验token的中间件
	 */
	public static jwtMiddleware() {
		// 使用 Passport 中的 JWT 策略进行身份验证，同时禁用 Session 功能。
		// 使用 JWT 进行身份验证的情况，通常不需要会话支持
		return passport.authenticate('jwt', { session: false });
	}

	/**
	 * 关联express
	 */
	public init() {
		// 用于初始化 Passport 并将其添加到 Express 应用程序中的中间件链中。它必须在使用 Passport 的 Express 应用程序中首先被调用
		return passport.initialize();
	}
}
